// File: jmcomic-core/src/main/java/dev/jukomu/jmcomic/client/JmApiResp.java
package dev.jukomu.jmcomic.client;

import dev.jukomu.common.util.json.AdvancedMap;
import dev.jukomu.common.util.json.JsonUtils;
import dev.jukomu.jmcomic.util.JmCryptoUtils;
import okhttp3.Response;

import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

/**
 * 对应Python的JmApiResp，用于处理禁漫API的JSON响应。
 * 支持解密API返回的加密数据。
 */
public class JmApiResp extends JmJsonResp {

    private final long timestamp; // 请求API时使用的时间戳
    // 缓存解密后的数据
    private final AtomicReference<Map<String, Object>> decodedDataCache = new AtomicReference<>(null);

    /**
     * 构造函数。
     *
     * @param rawResponse 原始OkHttp响应对象。
     * @param timestamp   请求时使用的时间戳。
     */
    public JmApiResp(Response rawResponse, long timestamp) {
        super(rawResponse);
        this.timestamp = timestamp;
    }

    @Override
    public boolean isSuccess() {
        if (!super.isSuccess()) {
            return false;
        }
        // 检查API返回的code字段
        Object code = getJson().get("code");
        return code instanceof Number && ((Number) code).intValue() == 200;
    }

    /**
     * 获取加密的API数据。
     *
     * @return Base64编码的加密数据字符串。
     */
    public String getEncodedData() {
        return (String) getJson().get("data");
    }

    /**
     * 获取解密后的API数据（Map形式）。
     *
     * @return 解密后的数据Map。
     */
    public Map<String, Object> getResData() {
        if (decodedDataCache.get() == null) {
            synchronized (decodedDataCache) {
                if (decodedDataCache.get() == null) {
                    requireSuccess(); // 确保在解密前响应是成功的
                    try {
                        String decodedJson = JmCryptoUtils.decodeRespData(getEncodedData(), timestamp, null);
                        decodedDataCache.set(JsonUtils.parseStringAsMap(decodedJson));
                    } catch (Exception e) {
                        throw new RuntimeException("Failed to decode API response data", e);
                    }
                }
            }
        }
        return decodedDataCache.get();
    }

    /**
     * 获取解密后的API数据（AdvancedMap形式）。
     *
     * @return 解密后的数据AdvancedMap。
     */
    public AdvancedMap getModelData() {
        return new AdvancedMap(getResData());
    }
}